package com.eedi.framework.template.dal.dataobject;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.eedi.framework.common.enums.CommonStatusEnum;
import com.eedi.framework.common.enums.YesOrNoEnum;
import com.eedi.framework.template.enums.SysTemplateMenuTypeEnum;
import com.eedi.framework.tenant.core.db.TenantBaseDO;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 菜单 DO
 *
 */
@TableName("sys_template_menu")
@Data
@EqualsAndHashCode(callSuper = true)
public class SysTemplateMenuDO extends TenantBaseDO {

    /**
     * 菜单编号 - 根节点
     */
    public static final String SYS_ID_ROOT ="0";


    /**
     * 菜单业务id
     */
    @TableId(type = IdType.ASSIGN_UUID)
    private String sysTemplateMenuId;

    /**
     * 菜单名称
     */
    private String sysMenuName;
    /**
     * 权限标识
     *
     * 一般格式为：${系统}:${模块}:${操作}
     * 例如说：system:admin:add，即 system 服务的添加管理员。
     *
     * 当我们把该 MenuDO 赋予给角色后，意味着该角色有该资源：
     * - 对于后端，配合 @PreAuthorize 注解，配置 API 接口需要该权限，从而对 API 接口进行权限控制。
     * - 对于前端，配合前端标签，配置按钮是否展示，避免用户没有该权限时，结果可以看到该操作。
     */
    private String sysMenuPermission;
    /**
     * 菜单类型
     *
     * 枚举 {@link SysTemplateMenuTypeEnum}
     */
    private SysTemplateMenuTypeEnum sysMenuType;
    /**
     * 显示顺序
     */
    private Integer sysMenuSort;
    /**
     * 父菜单ID
     */
    private String parentSysMenuId;
    /**
     * 路由地址
     *
     * 如果 path 为 http(s) 时，则它是外链
     */
    private String sysMenuPath;
    /**
     * 菜单图标
     */
    private String sysMenuIcon;
    /**
     * 组件路径
     */
    private String sysMenuComponent;
    /**
     * 组件名
     */
    private String sysMenuComponentName;
    /**
     * 状态
     *
     * 枚举 {@link CommonStatusEnum}
     */
    private CommonStatusEnum sysMenuStatus;
    /**
     * 是否可见
     *
     * 只有菜单、目录使用
     * 当设置为 true 时，该菜单不会展示在侧边栏，但是路由还是存在。例如说，一些独立的编辑页面 /edit/1024 等等
     */
    private YesOrNoEnum sysMenuVisible;
    /**
     * 是否缓存
     *
     * 只有菜单、目录使用，否使用 Vue 路由的 keep-alive 特性
     * 注意：如果开启缓存，则必须填写 {@link #sysMenuComponentName} 属性，否则无法缓存
     */
    private YesOrNoEnum sysMenuKeepAlive;
    /**
     * 是否总是显示
     *
     * 如果为 false 时，当该菜单只有一个子菜单时，不展示自己，直接展示子菜单
     */
    private YesOrNoEnum sysMenuAlwaysShow;


}
